<?php 

class Model
{
    private $link;//连接标识
    private $tabName;//用于存储表名
    private $fields;//用于存储表字段们
    private $pk;//主键字段的名字
    private $keys;//要查询的字段
    private $where;//where条件
    private $order;//排序条件
    private $limit;//分页条件

    //初始化数据库连接
    public function __construct($tabName)
    {
        //返回对象 ,存为link连接属性
        $this->link = mysqli_connect(HOST, USER, PASS, DB);
        mysqli_set_charset($this->link, CHAR);
        //接收实例化时,传入的表名
        $this->tabName = $tabName;
        //自动获取当前表字段们
        $this->getField();
    }
    
    //查全部
    public function select()
    {
        $keys = '*';//默认查询全部
        //判断有无字段
        if (!empty($this->keys)) {
            $keys = $this->keys;
            $this->keys = null;//每次清除查询条件
        }
        $where = '';
        //判断有无where条件
        if (!empty($this->where)) {
            $where = 'WHERE '.$this->where;
            $this->where = null;//每次清除条件
        }
        $order = '';
        //判断有无order条件
        if (!empty($this->order)) {
            $order = 'ORDER BY '.$this->order;
            $this->order = null;//每次清除条件
        }
        $limit = '';
        //判断有无limit条件
        if (!empty($this->limit)) {
            $limit = 'LIMIT '.$this->limit;
            $this->limit = null;//每次清除条件
        }

        $sql = "SELECT {$keys} FROM {$this->tabName} {$where} {$order} {$limit}";
        return $this->query($sql);
    }

    //查单条
    public function find($findValue, $findKey = 'id')
    {
        $keys = '*';//默认查询全部
        //判断有无字段
        if (!empty($this->keys)) {
            $keys = $this->keys;
            $this->keys = null;//每次清除查询条件
        }
        $sql = "SELECT {$keys} FROM {$this->tabName} WHERE {$findKey}='{$findValue}' LIMIT 1";
        //接收查询的结果集
        $data = $this->query($sql);
        //判断是否为空
        if (empty($data)) {
            return false;
        }
        //返回结果数组  一维
        return $data[0];
    }

    //获取要查询的where条件 对象链操作
    public function where($where)
    {
        $this->where = $where;
        return $this;//返回自己
    }

    //获取排序条件
    public function order($order)
    {
        $this->order = $order;
        return $this;//返回自己
    }

    //获取分页条件
    public function limit($limit)
    {
        $this->limit = $limit;
        return $this;//返回自己
    }

    //获取 要查询的字段们 对象链操作
    public function field($arr)
    {
        //判断参数 是否是数组 如果不是 直接返回自己
        if (!is_array($arr)) return $this;

        //过滤参数 删除非法字段
        foreach ($arr as $key => $val) {
            if (!in_array($val, $this->fields)) {
                unset($arr[$key]);
            }
        }

        //如果处理好的数组 为空,直接返回自己
        if (empty($arr)) return $this;

        //生成字段条件,存为属性
        $this->keys = implode(',', $arr);

        //返回对象自己
        return $this;
    }

    //删除数据
    public function del($delValue, $delKey = 'id')
    {
        $sql = "DELETE FROM {$this->tabName} WHERE {$delKey}='{$delValue}'";
        return $this->execute($sql);
    }

    //插入数据
    public function add($data = array())
    {
        //直接给参数设置POST不合适
        //判断 赋值:如果$data为空 则使用POST的数据.
        if (empty($data)) {
            $data = $_POST;
        }

        //筛选POST数据
        foreach ($data as $k => $v) {
            //如果POST里的$k 在字段列表之中  就保留
            if (in_array($k, $this->fields)) {
                $list[$k] = $v;
            }
        }

       /* echo '<pre>';
            print_r($list);
        echo '</pre>';
        exit;*/
        
        //生成SQL中的key和value
        $keys = implode(',', array_keys($list));
        $values = implode("','", array_values($list));

        $sql = "INSERT INTO {$this->tabName} ({$keys}) VALUES('$values')";
        return $this->execute($sql);
    }
    
    //编辑操作
    public function update($data = array())
    {
        //直接给参数设置POST不合适
        //判断 赋值:如果$data为空 则使用POST的数据.
        if (empty($data)) {
            $data = $_POST;
        }
        //筛选POST数据
        foreach ($data as $k => $v) {
            //如果POST里的$k存在与字段列表中 就保留 (可排除主键)
            if (in_array($k, $this->fields) && $k != $this->pk) {
                $list[] = "`{$k}`='{$v}'";
            }
        }
        // var_dump($list);
        //生成SQL的SET条件
        $set = implode(',', $list);

        $sql = "UPDATE {$this->tabName} SET {$set} WHERE `{$this->pk}`='{$data[$this->pk]}'";

        //执行操作  返回true 或false
        return $this->execute($sql);
    }

    //统计条目数
    public function count()
    {
        $where = '';
        //判断有无where条件
        if (!empty($this->where)) {
            $where = 'WHERE '.$this->where;
            $this->where = null;//每次清除条件
        }
        $sql = "SELECT COUNT(*) total FROM {$this->tabName} {$where}";
        $total = $this->query($sql);
        return $total[0]['total'];
    }

    /*******************辅助方法**************************/

    //获取数据表的表内字段
    private function getField()
    {
        //查询表结构
        $sql = "DESC {$this->tabName}";
        $list = $this->query($sql);
        // var_dump($list);exit;
        
        $fields = array();
        foreach ($list as $val) {
            $fields[] = $val['Field'];
            //获取主键 
            if ($val['Key'] == 'PRI') {
                $this->pk = $val['Field'];
            }
        }
        //给属性赋值
        $this->fields = $fields;
    }

    //执行查询  返回查询数组 或 false
    private function query($sql)
    {
        //执行SQL语句
        $result = mysqli_query($this->link, $sql);

        //判断有无查询数据
        if ($result && mysqli_num_rows($result) > 0) {
            $list  = array();//存储查询结果
            $list = mysqli_fetch_all($result, MYSQLI_ASSOC);
            return $list;//查询成功 返回查询结果
        } else {
            return false;//查询失败,返回false
        }
    }

    //执行增删改 返回执行结果 或 自增ID
    private function execute($sql)
    {
        //执行SQL语句
        $result = mysqli_query($this->link, $sql);

        //处理结果集
        if ($result && mysqli_affected_rows($this->link) > 0) {
            //添加时  会返回自增ID
            if (mysqli_insert_id($this->link) > 0) {
                // 添加时 返回自增ID
                return mysqli_insert_id($this->link);
            } else {
                //删改成功 返回true
                return true;
            }
        } else {
            //操作失败 返回false
            return false;
        }
        
    }


    //销毁连接
    public function __destruct()
    {
        mysqli_close($this->link);
    }
}



